<?php
	/**
	  * @package	MyTools
	  * @name		UrlProcessor
	  * @brief		Clase para validar existencia de una URL
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2010-01-04
	  * @version	0.1.0
  	**/

	final class UrlProcessor extends MyDebuger implements MyVersions {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 1;
		/* numero de revision de la clase */
		private static $revision		= 0;

		/* url a procesar */
		private $url		= False;
		/* cabeceras obtenidas */
		private $headers	= Array();

		public function __construct($debug = False) {
			/* creamos el padre */
			parent::__construct($debug, __CLASS__);
		}

		public function __destruct() {
			/* matamos el padre */
			parent::__destruct();
		}

		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		public static function urlExists($url = Null, $debug = False) {
			/* ingresamos a un control de errores para capturar mis excepciones */
			try {
				/* ingresamos a un control de errores para capturar las excepciones de ejecucion */
				try {
					/* creamos una instancia */
					$urlExists = new UrlProcessor($debug);
					/* verificamos la existencia de la clase UrlValidator */
					$urlExists->verificarClase('UrlValidator');
					/* verificamos los valores ingresados */
					$urlExists->verificarDatos($url);
					/* verificamos si existe y retornamos el valor */
					return $urlExists->existeUrl($url);
				/* capturamos las excepciones */
				} catch (Exception $e) {
					/* capturamos todos los errores y los transformamos en mi excepcion */
					$urlExists->newException($e);
				}
			/* capturamos mis excepciones */
			} catch (MyException $e) {
				/* si se produjo una excepcion la manejamos con el metodo 'show' */
				$urlExists->show($e->getMensaje());
			}
		}

		private function verificarDatos($url) {
			/* mostramos un mensaje */
			$this->show('Verificando datos ingresados..', False);
			/* verificamos si ingreso la url */
			if ($url === Null)
				/* salimos con una excepcion */
				$this->newException('No se especifico la URL a verificar');
			/* verificamos que sea una URL valida */
			if (UrlValidator::validateUrl($url) !== True)
				/* salimos con una excepcion */
				$this->newException('La URL ingresada no tiene un formato valido');
			/* mostramos ok al mensaje */
			$this->showOK();
			/* almacenamos la url */
			$this->url = $url;
		}

		private function existeUrl() {
			/* mostramos un mensaje */
			$this->show('Verificando existencia de la URL ' . $this->blue($this->italic($this->url)) . '..', False);
			/* obtenemos las cabeceras */
			$this->getHeaders();
			/* verificamos si el header es correcto */
			if (!isset($this->headers[0]) || (isset($this->headers[0]) && (!preg_match('/(200|301|302|303|304|307|304)/', $this->headers[0])))) {
				/* mostramos un mensaje */
				$this->red('La direccion URL retorno una respuesta invalida');
				/* retornamos false */
				return False;
			}
			/* mostramos ok al mensaje */
			$this->showOK();
			/* retornamos true */
			return True;
		}

		private function getHeaders() {
			/* ingresamos a un control de errores para capturar mis excepciones */
			try {
				/* ingresamos a un control de errores para capturar las excepciones de ejecucion */
				try {
					/* obtenemos las cabeceras */
					$this->headers = get_headers($this->url);
				/* capturamos las excepciones */
				} catch (Exception $e) {
					/* capturamos todos los errores y los transformamos en mi excepcion */
					$this->newException('La direccion URL retorno una respuesta invalida');
				}
			/* capturamos mis excepciones */
			} catch (MyException $e) {
				/* si se produjo una excepcion la manejamos con el metodo 'show' */
				$this->show($e->getMensaje());
			}
		}
	}
?>